//
//  File.swift
//  Documentation
//
//  Created by Toj on 6/26/23.
//

import Foundation

// MARK: - 1. CALayer
CALayer 就是屏幕显示的基础.
看到的所有内容全是由CALayer完成

// MARK: - 2. CALayer 是显示的基础：存储 bitmap
那 CALayer 是如何完成的呢? 让我们来从源码向下探索一下, 在 CALayer.h 中, CALayer 有这样一个属性 contents:
contents 提供了 layer 的内容, 是一个指针类型, 在 iOS 中的类型就是 CGImageRef(在 OS X 中还可以是 NSImage)
而我们进一步查到, Apple 对 CGImageRef 的定义是
实际上, CALayer 中的 contents 属性保存了由设备渲染流水线渲染好的位图 bitmap(通常也被称为 backing store).
而当设备屏幕进行刷新时, 会从 CALayer 中读取生成好的 bitmap, 进而呈现到屏幕上.

那么在运行时, 操作系统会调用底层的接口, 将 image 通过 CPU+GPU 的渲染流水线渲染得到对应的 bitmap, 存储于 CALayer.contents 中, 在设备屏幕进行刷新的时候就会读取 bitmap 在屏幕上呈现.

也正因为每次要被渲染的内容是被静态的存储起来的, 所以每次渲染时, Core Animation 会触发调用 drawRect: 方法, 使用存储好的 bitmap 进行新一轮的展示.


// MARK: - 3. CALayer 与 UIView 的关系
// MARK: - 3.1. UIView

从官方文档可以看出, UIView 是 app 中的基本组成结构, 定义了一些统一的规范.
它会负责内容的渲染以及, 处理交互事件.
具体而言, 它负责的事情可以归为下面三类

Drawing and animation：绘制与动画
Layout and subview management：布局与子 view 的管理
Event handling：点击事件处理

// MARK: - 3.2. CALayer
从官方文档可以看出, CALayer 的主要职责是管理内部的可视内容.
当我们创建一个 UIView 的时候, UIView 会自动创建一个 CALayer, 为自身提供存储 bitmap 的地方(也就是前文说的 backing store), 并将自身固定设置为 CALayer 的代理.

CALayer 是 UIView 的属性之一, 负责渲染和动画, 提供可视内容的呈现.
UIView 提供了对 CALayer 部分功能的封装, 同时也另外负责了交互事件的处理.
